package com.qdu.security;

import com.qdu.entity.Userinfo;
import com.qdu.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class CustomerUsersDetailsService implements UserDetailsService {
    @Autowired
    private UserService mapper;

    //在loadUserByUsername()方法中指定用户数据如何从数据库获取
    //将从数据库获取的用户信息和用户权限（角色）信息封装到一个UserDetails对象中返回
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //该方法的参数username是用户在登录页面输入的用户名，会直接传入的，所以直接使用即可
        Userinfo userInfo=mapper.selectByUname(username);
        //如果用户不存在，则抛出一个异常
        if(null==userInfo)
            throw new UsernameNotFoundException("无此用户");

        //根据用户名查询它所有的角色的名称
//        List<Userinfo> roles=mapper.selectByUname(username);

        //用户的角色/权限需要封装成一个List<GrantedAuthority>集合
        //才能被spring security使用
        List<GrantedAuthority> authorities=new ArrayList<>();
//        for(String role:roles) {
            //需要将每个角色名称封装成一个GrantedAuthority对象
            //表示授予该用户的权限，添加到授权列表中
            //将角色封装成GrantedAuthority对象的时候，需要添加ROLE_前缀
            authorities.add(new SimpleGrantedAuthority("ROLE_user"));
//        }

        //只要将数据库中用户的信息能封装成一个UserDetails(User类为UserDetails接口的实现类)对象
        //返回，然后Spring Security就可以使用该UserDetails对象包含的用户信息进行验证和授权
        return new User(userInfo.getUid(),userInfo.getUpwd(),authorities);
    }
}
